#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#define ll unsigned long long int
using namespace std;


const ll mod = 1000000007;

ll BinPow(ll x, ll y)
{
	ll ans = 1ull;
	while (y > 0)
	{
		if (y % 2)
		{			
			ans = (ans * x) % mod;			
			--y;
		}
		else
		{
			x = (x * x) % mod;
			y /= 2;
		}
	}
	return ans % mod;
}

ll Cnk(ll n, ll k)
{
	ll ans = 1ll;
	for (long long i = 1; i <= n - k ; ++i)
	{
		//ll fkjshk = BinPow (i + 1, mod - 2);
		ans = (((ans * (n - i + 1)) % mod) * BinPow (i + 1, mod - 2)) % mod;

		//ans = (((ans * (n - i +)) % mod) * BinPow (i, mod - 2)) % mod;
	}
	return ans;
}

ll dp[2002][2001];
ll sum;

long long F(ll n, ll D, ll x)
{
	dp[0][0] = 1ll;
	//sum[0] = 1;
	
	for (int i = 1; i <= n; ++i)
	{
		dp[i][0] = 0ll;
		//sum[i] = sum[i - 1];
		if (i < x)
		{
			dp[i][0] = 1ll;
			//sum[i] = sum[i - 1] + 1;
		}
	}
	ll delta;
	for (int d = 1; d < n; ++d)
	{
		dp[0][d] = 1ll;
		for (int  i = 1; i <= n; ++i)
		{
			dp[i][d] = (dp[i - 1][d] + dp[i][d - 1]) % mod;
			if (i >= x)
			{
				dp[i][d] = (dp[i][d] - dp[i - x][d - 1] + mod) % mod;
			}						
		}
		
	}

	if (D <= n)
	{
		return dp[n][D - 1];
	}
	else
	{
		/*ll klfj = dp[n][n - 1];
		ll fjsal = Cnk(D, D - n);*/
		return (dp[n][n - 1] * Cnk(D, D - n)) % mod;
	}
}


int main()
{
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);

	ll n, d, x;
	cin >> n >> d >> x;

	/*cout << (6 / 3) % 5 << endl;
	cout << (6 * BinPow(3, 3)) % 5 << endl;
	cout <<BinPow(3, 3);*/
	
	while (n != 0)
	{
		cout << F(n, d, x) << endl;
		cin >> n >> d >> x;
	}


	return 0;
}